package com.kty.cesuan.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kty.cesuan.mapper.XlrMapper;
import com.kty.cesuan.pojo.Xlr;
import com.kty.cesuan.service.XlrService;
import com.kty.methods.utils.Utils;
import com.kty.methods.xlr.method.choice.GregorianDate;
import com.kty.methods.xlr.method.choice.LunarDate;
import com.kty.methods.xlr.method.choice.NowDate;
import com.kty.methods.xlr.method.entrance.XiaoLiuRen;
import com.kty.methods.xlr.method.xlr.LiuRen;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class XlrServiceImpl extends ServiceImpl<XlrMapper, Xlr> implements XlrService {

    @Autowired
    private XlrService xlrService;
    private static final XiaoLiuRen xiaoLiuRen = new XiaoLiuRen();

//**********************************************************************************************************************

    /**
     * 按照当前公历日期测算
     */
    public boolean now() {

        // 按照【当前日期测算】
        LiuRen xiaoLiuRen = new NowDate().getXiaoLiuRen();

        // 信息封装
        XlrServiceImpl.xiaoLiuRen.run(xiaoLiuRen);

        // 信息保存至数据库
        return calculation(xiaoLiuRen);

    }

    /**
     * 按照指定日期测算
     *
     * @param year 农历年
     * @param month 农历月
     * @param day 农历人
     * @param time 时
     * @param minute 分
     * @param second 秒
     * @param choice 0：公历   1：农历
     */
    public boolean choice(int year, int month, int day, int time, int minute, int second, int choice) {

        // 初始化
        LiuRen liuRen;
        // 判断
        if (choice == 1) {
            // 通过农历日期测算
            liuRen = new LunarDate(year, month, day, time, minute, second).getXiaoLiuRen();
        } else {
            // 通过公历日期测算
            liuRen = new GregorianDate(Utils.stringToDate(year, month, day, time, minute, second)).getXiaoLiuRen();
        }

        // 信息封装
        xiaoLiuRen.run(liuRen);

        // 信息保存至数据库
        return calculation(liuRen);

    }

    /**
     * 测算并保存信息
     */
    private boolean calculation(LiuRen liuRen) {

        // 1、数据判断
        // 条件构造（封装构造条件）
        LambdaQueryWrapper<Xlr> qw = new LambdaQueryWrapper<>();
        qw.in(Xlr::getLunarDate, liuRen.getLunarDateStr());
        int count = this.count(qw);
        // 若count>0，则不可再次测算
        if (count > 0) {
            return false;
        }

        // 2、设置数据
        Xlr xlr = xiaoLiuRen.infoToSql(liuRen);

        // 3、添加数据
        xlrService.save(xlr);
        return true;

    }

}
